﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using FasterWPF;

namespace FasterWPF
{
    public class ContentControlComposite : IComposite
    {
        public bool IsGrid()
        {
            return false;
        }

        public void RemoveFromChain(Border bdr) //unhook all the children so they may be re-added later, if desired
        {
            GetContainer<ContentControlPanel>(bdr).Children.Clear();
        }

        public C GetContainer<C>(Border bdr)
            where C: FrameworkElement
        {
           return ((C)(((ContentControl)(bdr.Child)).Content));
        }

        public C GetContainerFromChildContentControl<C>(ContentControl chain) where C : FrameworkElement
        {
           return ((C)(chain.Content));
        }

        public T GetParent<T>(ContentControl sender)
              where T : FrameworkElement
        {
            return (T)((ContentControl)sender).GetParentFromContentControlOfComposite<T>();
        }

        public Panel AddChild<T>(T source, System.Windows.Controls.ContentControl chain, int row, int col, System.Windows.FrameworkElement child)
       where T : FrameworkElement
        {
            ContentControlPanel g = ((ContentControlPanel)(chain.Content));
            g.Children.Add(child);

            return (Panel)g;
        }

        public void AddCompositeToContentControl<T>(T chain, ContentControl contentControl, object settings)
             where T : FrameworkElement
        {
            ContentControlPanel childPanel = new ContentControlPanel();

            contentControl.Content = childPanel;
        }

        public T GetParentFromChild<T>(FrameworkElement childElement) where T : FrameworkElement
        {
            return (T)((ContentControl)((ContentControlPanel)((FrameworkElement)childElement.Parent)).Parent).GetParentFromContentControlOfComposite<T>();
        }

        public System.Windows.Controls.Border GetBorder<T>(System.Windows.FrameworkElement childElement)
        {
            Border tempResults = null;

            tempResults = (Border)((ContentControlPanel)((FrameworkElement)childElement).Parent).Parent.Cast<ContentControl>().Parent;

            return tempResults;
        }

        public K Get<K, T>(System.Windows.Controls.ContentControl chain, int row, int column)
            where K : UIElement
            where T : FrameworkElement
        {
            return ((K)((ContentControlPanel)chain.Content).Children[0]);
        }

        public UIElementCollection GetChildren(object container)
        {
            return (container as ContentControlPanel).Children;
        }
    }
}
